<?php

class MX_Loader extends Loader {
    
    private $current   = 'www';
    private $tree      = array();
    private $setting   = array();
    
    
    /**
     * Инициализация данных
     * @param array $tree
     * @param string $current
     * @return void
     */
    public function initialize($tree, $current) {
        
        $this->tree = $tree;
        $this->current = $current;
        $this->setting = ($this->page_info('settings') != NULL) ? unserialize($this->page_info('settings')) : array();
    }
    
    
    /**
     * Получение информации о странице
     * @param string $field URI страницы
     * @param sytring $field Название свойства, значение которого нужно вернуть
     * @return mixed
     */
    public function page_info($field = false, $par = false) {
        
        if ($par === false) {
            
            $par = $this->current;
        }
        
        if ($field === false && isset($this->tree[$par])) {
            
            return $this->tree[$par];
        }

        return (isset($this->tree[$par][$field])) ? $this->tree[$par][$field] : false;
    }

    
    /**
     * Получение информации о странице по её ID
     * @param int $id ID страницы
     * @param sytring $field Название свойства, значение которого нужно вернуть
     * @return mixed
     */
    public function page_info_byid($id, $field = false) {
        
        foreach ($this->tree as $row) {
            
            if ($row['id'] == $id) {
                
                if ($field === false) {
                    
                    return $row;
                }
                
                return (isset($row[$field])) ? $row[$field] : false;
            }
        }
        
        return false;
    }
    
    
    /**
     * Вывод всех страниц списком
     * @param int $padding Отступ между уровнями
     * @return string
     */
    public function pages_tree($padding = 10) {
        
        $end = '<ul>';
        
        foreach($this->tree as $uri => $row) {
            
            $pad = $padding * $row['level'];
            $end .= '<li style="padding-left: '.$pad.'px;">'.anchor($row['url'], $row['title']).'</li>';
        }
        
        $end .= '</ul>';
        
        return $end;
    }
    
    
    /**
     * Получение дерева страниц
     * @return array
     */
    public function tree() {
        
        return $this->tree;
    }
    
    
    /**
     * Загрузка вида
     * @param string $view Имя файла вида
     * @param array $vars Данные для отображения
     * @param boolean Вернуть результат или нет
     * @return string
     */
    public function view($view, $vars = array(), $return = FALSE) {
        
        $search = array();
        $searched = false;
        $modul = $this->_module.'/';
        $template = Template::$_global_template;
        
        /* override subpath when loading from a subdirectory */
        $view_arr = explode('/', $view);
        $folder = false;
        
        if (count($view_arr) == 2) {
            
            $folder = $view_arr[0].'/';
            $view   = $view_arr[1];
        }
        else {
            
            $view = $view_arr[0];
        }
        
        $file_ext = strpos($view, '.') ? $view : $view.EXT;
        
        if ($folder == false) {
            
            $search[] = PATH_TO_TEMPLATE.$template;
            $search[] = PATH_TO_TEMPLATE.$template.'modules/'.$modul;
            $search[] = MODBASE.$modul.'views/';
        }
        else {
            
            $search[] = PATH_TO_TEMPLATE.$template.'/'.$folder;
            $search[] = PATH_TO_TEMPLATE.$template.'modules/'.$modul.'/'.$folder;
            $search[] = MODBASE.$modul.'views/'.$folder;
        }
        
        foreach ($search as $path2) {
            
            if (is_file($path2.$file_ext)) {
                
                self::$loader->_ci_view_path = $path2;
                $searched = true;
            }
        }
        
        /* file not found. show an error for these types */
        if (!$searched)            
            show_error("Unable to locate the file: ".$path2.$file_ext." in: views/");
        
        return self::$loader->_ci_load(array('_ci_view' => $view, '_ci_vars' => self::$loader->_ci_object_to_array($vars), '_ci_return' => $return));
    }
    
    
    /**
     * Получение настроек основного модуля
     * @param string $padding Название опции
     * @param string $defult Если опции нет или не задана, вернуть это значение
     * @return mixed
     */
    public function settings($name = false, $defult = false) {
        
        if (!$name) {
            
            return $this->setting;
        }
        
        if (isset($this->setting[$name])) {
            
            return $this->setting[$name];
        }
        
        return $defult;
    }
}